package com.neusoft.ch7;

import com.neusoft.ch7.abstractdemo.Shape;
import com.neusoft.ch7.staticdemo.Person;
import com.neusoft.ch7.staticdemo.Student;
import com.neusoft.ch7.staticdemo.Teacher;

/*
 * 课堂笔记：
 *    三大关键：static final abstract
 *    1、static关键字
 *       static关键字表示的是静态的（常驻内存的）；
 *       修饰范围：
 *          成员变量（属性）（不能修饰局部变量）；
 *          方法；
 *          语句块（孤立存在的一对{}）；
 *       解析：
 *          static修饰的成员变量叫静态变量；
 *          static修饰的方法叫静态方法；
 *          static修饰的语句块是静态语句块；
 *          
 *          (1)使用static修饰的对象（属性和方法）属于全类所有：
 *             可以通过类名直接访问(也可以通过实例变量访问，但是不推荐)；
 *          (2)静态的方法只能访问（调用）静态的方法或属性；（静态的访问（调用）静态的）
 *             非静态的方法既可以调用静态的属性和方法也可以调用非静态的方法和属性；   （非静态的都可以访问）
 *             静态方法中不能使用this和super关键字； 
 *             静态方法不能重写（静态方法没有多态）；            
 *          (3)静态语句块在类加载到jvm时就进行执行；并且只被执行一次；一般用于初始化处理。
 *          (4)类的非静态语句块，在类每次实例化时都会被执行；实例化一次会执行一次；
 *       练习题：
 *           以下代码中person和teacher类中的输出内容顺序？
 *           Teacher tea0 = new Teacher();
 *           Teacher tea1 = new Teacher();
 *           
 *    2、final关键字
 *       final最终的，终结的；
 *       修饰范围：
 *          变量（成员变量和局部变量）；
 *          方法；
 *          类；
 *       解析：
 *          final修饰的变量是常量，一旦初始化赋值之后，则不能再改变值；（按值传参的类型）
 *          final修饰的变量如果是引用（对象）类型，则限定是其引用的地址不能再改变，该对象的内容可以改变； （按引用传参的类型）         
 *          final一般和static配合使用，叫静态常量，一般命名规则：所有的单词大写，中间用_分割
 *          final修饰变量时，需要放在数据类型前面；例如 ： private final String name;
 *          
 *          final修饰的方法不允许重写，子类不能够覆盖重写该方法。（没有多态）
 *          
 *          final修饰的类不允许继承，也就是该类没有子类； 
 *           
 *   3、abstract关键字
 *      抽象关键字；
 *      修饰范围：
 *         方法；
 *         类；
 *      解析：
 *         abstract修饰方法叫抽象方法。
 *         抽象方法没有方法体，只有方法声明；
 *         语法：
 *             访问控制修饰符  其他修饰符  返回值类型  方法名(形参列表);
 *         抽象方法可以在子类中通过重写（覆盖）的方式将方法体实现；
 *         子类也可以直接继承抽象方法，不对其进行实现，则该方法在子类中还是抽象方法；
 *         抽象方法只能定义在抽象类中；
 *         抽象类中不一定非得要有抽象方法；
 *         有抽象方法的类一定是抽象类；
 *         如果子类没有实现所有的继承自父类的抽象方法，则该子类还是抽象类；
 *         抽象方法不能使用static修饰；
 *         
 *         abstract修饰类叫做抽象类，无论是否含有抽象方法；
 *         抽象类不能够new实例化；   
 *         抽象方法如果被子类继承，并且子类也没有全部实现所有的继承的抽象方法，则该子类也必须是抽象类；     
 *      
 *      作用：
 *         抽象方法作用是在封装一个行为时，当前层级上无法定义该方法的具体内容时，可以将其定义为抽象方法，
 *         将该抽象方法的实现推迟（延迟）到子类实现；
 *         
 *         抽象类是当一个类中有无法具体化的行为方法时，可以将其封装为抽象类；
 *         抽象类是对所有子类的抽象封装；
 *         
 *                 
 *   4、interface关键字
 *      接口关键字；
 *      接口是一种特殊的抽象类。           
 *              
 */
public class TestCh7 {	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		test03();
	}
	/**
	 * abstract示例
	 */
	private static void test05() {
		// 抽象类不能new创建实例对象
		//Shape shape0 = new Shape();
	}
	
	
	/**
	 * final示例
	 */
	private static void test04() {
		// final类型的局部变量
		final int age;
		// 改变age的值
		age =10;		
		// final类型的变量一旦赋值之后不允许在修改
		//age = 11;
	}
	
	
	/**
	 * static练习题:执行顺序
	 */
	private static void test03() {
		Teacher tea0 = new Teacher();
		System.out.println("====================");
		Teacher tea1 = new Teacher();
	}
	/**
	
	/**
	 * static示例
	 */
	private static void test02() {
		Teacher.eat();
		Person.eat();
	}
	/**
	 * static示例
	 */
	private static void test01() {
		// 静态属性和方法可以通过类名直接方法
		Student.pringMe();
		Student.stuName = "张三";
		// 非静态方法和属性，如果进行调用需要，先创建该类的实例对象，然后通过实例对象进行访问
		Student stu0 = new Student("小明", "15001", 70);
		// 访问非静态的属性和行为
		stu0.printStudentInfo();
		stu0.pringMe();
	}

}
